﻿using System;
using System.IO;
using System.IO.IsolatedStorage;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using Microsoft.Phone.Shell;

namespace TodayHumor
{
    public class SettingsModule
    {
        IsolatedStorageSettings sets = IsolatedStorageSettings.ApplicationSettings;

        // 앱 설정 저장소의 키 이름 및 기본값
        const string idKey = "id";
        const string PwKey = "Pw";
        const string AutoLoginKey = "AutoLogin";

        const string idDefault = "";
        const string PwDefault = "";
        const bool AutoLoginDefault = false;
    

        // 로그인할 때 쓰이는 ID
        public string LoginId
        {
            get
            {
                return GetSettingsValOrDefault<string>(idKey, idDefault);
            }
            set
            {
                if (UpdateSettings(idKey, value))
                {
                    SettingsSave();
                }
            }
        }

        // 로그인할 때 쓰이는 비밀번호
        public string LoginPw
        {
            get
            {
                return GetSettingsValOrDefault<string>(PwKey, PwDefault);
            }
            set
            {
                if (UpdateSettings(PwKey, value))
                {
                    SettingsSave();
                }
            }
        }

        // 자동로그인 설정 여부
        public bool AutoLogin
        {
            get
            {
                return GetSettingsValOrDefault<bool>(AutoLoginKey, AutoLoginDefault);
            }
            set
            {
                if (UpdateSettings(AutoLoginKey, value))
                {
                    SettingsSave();
                }
            }
        }


        /// <summary>
        /// 어플리케이션 설정 값을 받아온다. 만약 그 설정 값이 없으면, 2번째 파라미터인 "defVal"을 반환한다.
        /// </summary>
        /// <typeparam name="T">받아오는 설정 값의 자료형이다.</typeparam>
        /// <param name="key">어플리케이션 설정의 인덱스로 쓰인다.</param>
        /// <param name="defVal">어플리케이션 설정 로드에 실패했을 때 반환하는 값이다.</param>
        /// <returns>어플리케이션 설정을 받아옴에 성공하면 그 설정 값을, 실패하면 defVal을 반환한다.</returns>
        public T GetSettingsValOrDefault<T>(string key, T defVal)
        {
            T val;

            // 설정에 넘어온 key값의 정보가 있으면
            if (sets.Contains(key))
            {
                // 그 값의 정보를 반환한다.
                val = (T)sets[key];
            }
            else
            {
                // 아니면 기본값을 반환한다.
                val = defVal;
            }

            return val;
        }

        /// <summary>
        /// 어플리케이션 설정을 저장한다.
        /// </summary>
        private void SettingsSave()
        {
            sets.Save();
        }

        /// <summary>
        /// key와 value 값을 받아 어플리케이션 설정 저장소에 업데이트한다. key 값이 없으면 새로 생성하여 value 값을 할당한다.
        /// </summary>
        /// <param name="key">어플리케이션 저장소 키이다. 어플리케이션 설정의 인덱스로 사용된다.</param>
        /// <param name="value">저장하는 값이다.</param>
        /// <returns>성공했으면 true, 실패했으면 false를 반환한다.</returns>
        public bool UpdateSettings(string key, object value)
        {
            bool ValueChanged = false;

            if (sets.Contains(key))
            {
                // 키 값이 있으면 덮어씌워 저장한다.
                if (sets[key] != value)
                {
                    sets[key] = value; ValueChanged = true;
                }
            }
            else
            {
                // 없으면 새로 만들어서 저장한다.
                sets.Add(key, value); ValueChanged = true;
            }

            return ValueChanged;
        } 
    }
}
